import api from '../../api';
import { message } from 'antd';

export const namespace = 'SceneTemplateSettingsM';
export const operateTypeObj = Object.freeze({
  add: 'ADD',
  edit: 'EDIT',
});
export default {
  namespace,
  state: {
    copiedSceneTemplateInfo: null, // 第一步选择情景时获取到的详情数据
    sceneTemplateList: [], // 情景模板列表
    operateType: operateTypeObj.add, // 新增还是编辑 ADD | EDIT, 默认新增
    mainState: {
      sceneTemplateInfo: null, // 情景模板选中获取的详情
    }, // 主页面共享state
    stepOneState: {}, // 设置基本信息
    stepTwoState: {}, // 选择情景项
    stepThreeState: [], // 配置风险因子
    tableOldData: [], // 存放风险因子旧数据
    factorDictObj: {}, // 维度下拉字典
  },
  effects: {
    // 情景模板获取列表
    *getSceneTemplate({ payload, callback }, { call, put }) {
      const res = yield call(api.sceneTempleteSetting.getSceneTemplate, payload);
      if (res && res.code == 0) {
        callback(res.data);
        yield put({
          type: 'save',
          payload: {
            sceneTemplateList: res.data,
          },
        });
      } else {
        const config = [
          {
            sceneName: '历史重大事件压力情景',
            sceneId: '1',
            des: 'gOApM5',
            operateTypes: [],
            children: [
              {
                sceneId: '1.1',
                parentSceneId: '1',
                sceneName: '2008年金融危机',
                des: 'Q%XwnkV',
                operateTypes: ['add', 'edit', 'del'],
                iconType: null,
              },
              {
                sceneId: '1.2',
                parentSceneId: '1',
                sceneName: '默认情景1',
                des: 'Q%XwnkV',
                operateTypes: ['add'],
                iconType: null,
              },
              {
                sceneId: '1.3',
                parentSceneId: '1',
                sceneName: '默认情景2',
                des: 'Q%XwnkV',
                operateTypes: [],
                iconType: null,
              },
            ],
          },
          {
            sceneName: '专家预测压力情景',
            sceneId: '2',
            des: 'gOApM5',
            operateTypes: [],
            children: [
              {
                sceneId: '2.1',
                parentSceneId: '2',
                sceneName: '债券市场指数下跌情景',
                des: 'Q%XwnkV',
                operateTypes: ['add'],
                iconType: '1',
              },
              {
                sceneId: '2.2',
                parentSceneId: '2',
                sceneName: '专家预测压力情景1',
                des: 'Q%XwnkV',
                operateTypes: ['add', 'edit'],
                iconType: '1',
              },
            ],
          },
          {
            sceneName: '自预测压力情景2',
            sceneId: '3',
            des: 'gOApM5',
            operateTypes: [],
            children: [
              {
                sceneId: '3.1',
                parentSceneId: '3',
                sceneName: '开放式产品损失',
                des: 'Q%XwnkV',
                operateTypes: ['add'],
                iconType: '2',
              },
              {
                sceneId: '3.2',
                parentSceneId: '3',
                sceneName: '现金管理类产品',
                des: 'Q%XwnkV',
                operateTypes: ['add', 'edit'],
                iconType: '2',
              },
            ],
          },
        ];
        callback(config);
        yield put({
          type: 'save',
          payload: {
            sceneTemplateList: config,
          },
        });
        message.error(res?.msg ?? '查询情景模板列表失败!');
      }
    },
    *getSceneTemplateDetail({ payload, callback }, { call, put }) {
      const res = yield call(api.sceneTempleteSetting.getRiskFactorConfig, { sceneId: payload.sceneId });
      if (res && res.code == 0) {
        // 如果第一步选了复制存到新的state
        if (payload.isCopy) {
          yield put({
            type: 'save',
            payload: {
              copiedSceneTemplateInfo: res.data,
            },
          });
        } else {
          yield put({
            type: 'save',
            payload: {
              mainState: {
                sceneTemplateInfo: res.data,
              },
            },
          });
        }
      } else {
        const sceneTemplateInfo = {
          sceneName: '情景模板名称',
          des: '情景模板描述',
          correlation: 0, // 不考虑相关性（默认）
          pressMethod: 1, // 基于自定义（默认）ratioLoss
          sceneList: ['curveLoss', 'ratioLoss', 'redemption', 'realizable'], // 需要进行压测的情景ID
          riskNum: 3, // 因子变动数量
          priceMethod: 1, // 近似估值法（默认）
          copySceneConfig: '1.3', // 复制的情景id
          riskFactor: [
            {
              id: 'default', // 风险因子ID-信用风险因子
              // priceMothod: 1, // 近似估值法（默认）
              setting: {
                // 头部信息，区分维度和值两部分
                header: { dimension: ['sectype', 'bondRate', 'bondType', 'bondInvestType'], threshold: ['risk1', 'risk2', 'risk3'] },
                // 数据信息
                body: [
                  // 第一条数据
                  [
                    { key: 'sectype', value: 'BOND', tag: false }, // 资产类型：债券，不是组标签
                    { key: 'bondRate', value: '11', tag: true }, // 信用评级：11，是组标签
                    { key: 'bondType', value: '1', tag: false }, // 债券类别：1，不是组标签
                    { key: 'bondInvestType', value: undefined, tag: false }, // 投资分类：没定义
                    { key: 'risk1', value: 0.18 }, // 第一个值
                    { key: 'risk2', value: 0.25 }, // 第二个值
                    { key: 'risk3', value: 0.35 }, // 第三个值
                  ],
                  // 第二条数据
                  [
                    { key: 'sectype', value: 'BOND', tag: false }, // 资产类型：债券，不是组标签
                    { key: 'bondRate', value: '11', tag: true }, // 信用评级：11，是组标签
                    { key: 'bondType', value: '1', tag: false }, // 债券类别：1，不是组标签
                    { key: 'bondInvestType', value: undefined, tag: false }, // 投资分类：没定义
                    { key: 'risk1', value: 0.18 }, // 第一个值
                    { key: 'risk2', value: 0.25 }, // 第二个值
                    { key: 'risk3', value: 0.35 }, // 第三个值
                  ],
                ],
              },
            },
            {
              id: 'SHCI', // 风险因子ID-上证综指
              setting: {
                // 头部信息，区分维度和值两部分
                header: { dimension: [], threshold: ['risk1', 'risk2', 'risk3'] },
                // 数据信息
                body: [
                  [
                    { key: 'risk1', value: 0.18 }, // 第一个值
                    { key: 'risk2', value: 0.25 }, // 第二个值
                    { key: 'risk3', value: 0.35 }, // 第三个值
                  ],
                ],
              },
            },
          ],
        };
        const sceneTemplateInfoCopy = {
          sceneName: '情景模板名称',
          des: '情景模板描述',
          correlation: 0, // 不考虑相关性（默认）
          pressMethod: 1, // 基于自定义（默认）
          sceneList: ['curveLoss', 'ratioLoss'], // 需要进行压测的情景ID
          riskNum: 3, // 因子变动数量
          priceMethod: 1, // 近似估值法（默认）
          copySceneConfig: undefined, // 复制的情景id
          riskFactor: [
            {
              id: 'default', // 风险因子ID-信用风险因子
              // priceMothod: 1, // 近似估值法（默认）
              setting: {
                // 头部信息，区分维度和值两部分
                header: { dimension: ['sectype', 'bondRate', 'bondType', 'bondInvestType'], threshold: ['risk1', 'risk2', 'risk3'] },
                // 数据信息
                body: [
                  // 第一条数据
                  [
                    { key: 'sectype', value: 'BOND', tag: false }, // 资产类型：债券，不是组标签
                    { key: 'bondRate', value: '11', tag: true }, // 信用评级：11，是组标签
                    { key: 'bondType', value: '1', tag: false }, // 债券类别：1，不是组标签
                    { key: 'bondInvestType', value: undefined, tag: false }, // 投资分类：没定义
                    { key: 'risk1', value: 0.18 }, // 第一个值
                    { key: 'risk2', value: 0.25 }, // 第二个值
                    { key: 'risk3', value: 0.35 }, // 第三个值
                  ],
                  // 第二条数据
                  [
                    { key: 'sectype', value: 'BOND', tag: false }, // 资产类型：债券，不是组标签
                    { key: 'bondRate', value: '11', tag: true }, // 信用评级：11，是组标签
                    { key: 'bondType', value: '1', tag: false }, // 债券类别：1，不是组标签
                    { key: 'bondInvestType', value: undefined, tag: false }, // 投资分类：没定义
                    { key: 'risk1', value: 0.18 }, // 第一个值
                    { key: 'risk2', value: 0.25 }, // 第二个值
                    { key: 'risk3', value: 0.35 }, // 第三个值
                  ],
                ],
              },
            },
            {
              id: 'SHCI', // 风险因子ID-上证综指
              setting: {
                // 头部信息，区分维度和值两部分
                header: { dimension: [], threshold: ['risk1', 'risk2', 'risk3'] },
                // 数据信息
                body: [
                  [
                    { key: 'risk1', value: 0.18 }, // 第一个值
                    { key: 'risk2', value: 0.25 }, // 第二个值
                    { key: 'risk3', value: 0.35 }, // 第三个值
                  ],
                ],
              },
            },
          ],
        };
        if (payload.isCopy) {
          yield put({
            type: 'save',
            payload: {
              copiedSceneTemplateInfo: sceneTemplateInfoCopy,
            },
          });
        } else {
          yield put({
            type: 'save',
            payload: {
              mainState: {
                sceneTemplateInfo,
              },
            },
          });
        }
      }
    },
    *delSceneTemplateList({ payload, callback }, { call, put }) {
      const res = yield call(api.sceneTempleteSetting.delSceneTemplate, payload);
      if (res && res.code == 0) {
        callback(true);
        message.error('删除成功');
      } else {
        callback(false);
        message.error(res?.msg);
      }
    },
    *saveSceneTemplate({ payload, callback }, { call, put }) {
      const res = yield call(api.sceneTempleteSetting.saveSceneTemplate, payload);
      if (res && res.code == '0') {
        callback(true, res);
      } else {
        callback(false, res);
      }
    },
    // 获取维度下拉字典
    *getDictList({ payload }, { call, put }) {
      // const res = yield call(api.sceneTempleteSetting.getDictList, payload);
      const res = {
        code: 0,
        data: {
          sectype: [
            {
              children: [
                {
                  title: '1-1',
                  value: '1-1',
                  selectable: false,
                  children: [
                    { title: '1-1-1', value: '1-1-1', selectable: false },
                    { title: '1-1-2', value: '1-1-2', selectable: false },
                  ],
                },
                { title: '1-2', value: '1-2', selectable: false },
              ],

              title: '12222222222222',
              value: '1',
            },
            {
              children: [{ title: '2-1', value: '2-1', selectable: false }],

              title: '2',
              value: '2',
            },
            {
              title: '3',
              value: '3',
            },
          ],
          bondRate: [
            {
              children: [
                {
                  title: '1-1',
                  value: '1-1',
                  selectable: false,
                  children: [
                    { title: '1-1-1', value: '1-1-1', selectable: false },
                    { title: '1-1-2', value: '1-1-2', selectable: false },
                  ],
                },
                { title: '1-2', value: '1-2', selectable: false },
              ],

              title: '12222222222222',
              value: '1',
            },
            {
              children: [{ title: '2-1', value: '2-1', selectable: false }],

              title: '2',
              value: '2',
            },
            {
              title: '3',
              value: '3',
            },
          ],
          bondType: [
            {
              children: [
                {
                  title: '1-1',
                  value: '1-1',
                  selectable: false,
                  children: [
                    { title: '1-1-1', value: '1-1-1', selectable: false },
                    { title: '1-1-2', value: '1-1-2', selectable: false },
                  ],
                },
                { title: '1-2', value: '1-2', selectable: false },
              ],

              title: '12222222222222',
              value: '1',
            },
            {
              children: [{ title: '2-1', value: '2-1', selectable: false }],

              title: '2',
              value: '2',
            },
            {
              title: '3',
              value: '3',
            },
          ],
          bondInvestType: [
            {
              children: [
                {
                  title: '1-1',
                  value: '1-1',
                  selectable: false,
                  children: [
                    { title: '1-1-1', value: '1-1-1', selectable: false },
                    { title: '1-1-2', value: '1-1-2', selectable: false },
                  ],
                },
                { title: '1-2', value: '1-2', selectable: false },
              ],

              title: '12222222222222',
              value: '1',
            },
            {
              children: [{ title: '2-1', value: '2-1', selectable: false }],

              title: '2',
              value: '2',
            },
            {
              title: '3',
              value: '3',
            },
          ],
        },
        msg: 'dN[Ul',
      };
      if (res && res.code == '0') {
        yield put({
          type: 'save',
          payload: {
            factorDictObj: res.data,
          },
        });
      } else {
        message.error(res?.msg || '获取维度下拉列表失败！');
        yield put({
          type: 'save',
          payload: {
            factorDictObj: {},
          },
        });
      }
    },
  },
  reducers: {
    save(state, { payload }) {
      return {
        ...state,
        ...payload,
      };
    },
  },
};
